package cn.jetpiece.cloud.joss.app.modular.basics.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.jetpiece.cloud.joss.app.modular.basics.wrapper.ConfigWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.jetpiece.cloud.joss.api.basic.model.params.CreateConfigParam;
import cn.jetpiece.cloud.joss.api.basic.model.params.UpdateConfigParam;
import cn.jetpiece.cloud.joss.api.basic.model.query.ConfigQuery;
import cn.jetpiece.cloud.joss.api.basic.model.result.ConfigResult;
import cn.jetpiece.cloud.joss.app.modular.basics.entity.Config;
import cn.jetpiece.cloud.joss.app.modular.basics.mapper.ConfigMapper;
import cn.jetpiece.cloud.joss.app.modular.basics.service.ConfigService;
import cn.jetpiece.cloud.joss.app.modular.object.enums.BasicExceptionEnum;
import cn.jetpiece.cloud.core.page.PageFactory;
import cn.jetpiece.cloud.model.exception.ServiceException;
import cn.jetpiece.cloud.model.page.PageResult;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 对象存储配置 服务实现类
 * </p>
 *
 * @author XuJZ
 * @since 2020-09-05
 */
@Service
public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements ConfigService {

    @Override
    public boolean add(CreateConfigParam param) {
        LambdaQueryWrapper<Config> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Config::getConfigKey, param.getConfigKey());
        if (super.count(wrapper) > 0) {
            throw new ServiceException(BasicExceptionEnum.CONFIG_REPEAT);
        }
        Config bean = new Config();
        BeanUtil.copyProperties(param, bean);
        return super.save(bean);
    }

    @Override
    public boolean update(UpdateConfigParam param) {
        Config oldBean = super.getById(param.getId());
        if (oldBean == null) {
            throw new ServiceException(BasicExceptionEnum.CONFIG_NOT_EXISTED);
        }
        if (StrUtil.isNotEmpty(param.getConfigKey())) {
            LambdaQueryWrapper<Config> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(Config::getConfigKey, param.getConfigKey());
            wrapper.ne(Config::getId, oldBean.getId());
            if (super.count(wrapper) > 0) {
                throw new ServiceException(BasicExceptionEnum.CONFIG_REPEAT);
            }
        }
        Config update = BeanUtil.copyProperties(param, Config.class);
        update.setId(param.getId());
        return super.updateById(update);
    }

    @Override
    public boolean delete(String id) {
        Config bean = super.getById(id);
        if (bean == null) {
            throw new ServiceException(BasicExceptionEnum.CONFIG_NOT_EXISTED);
        }
        return super.removeById(id);
    }

    @Override
    public PageResult<ConfigResult> page(ConfigQuery param) {
        LambdaQueryWrapper<Config> wrapper = new LambdaQueryWrapper<>();
        if (StrUtil.isNotEmpty(param.getId())) {
            wrapper.eq(Config::getId, param.getId());
        }
        if (StrUtil.isNotEmpty(param.getConfigKey())) {
            wrapper.eq(Config::getConfigKey, param.getConfigKey());
        }
        if (StrUtil.isNotEmpty(param.getConfigName())) {
            wrapper.eq(Config::getConfigName, param.getConfigName());
        }
        if (StrUtil.isNotEmpty(param.getConfigValue())) {
            wrapper.eq(Config::getConfigValue, param.getConfigValue());
        }
        if (param.getIsEnable() != null) {
            wrapper.eq(Config::getIsEnable, param.getIsEnable());
        }

        IPage<Config> iPage = PageFactory.defaultPage();
        IPage<Config> page = super.page(iPage, wrapper);
        return new ConfigWrapper(page).setWrapper(param.getWrapper()).wrapPageResult();
    }
}
